#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H

#include <QString>

class NetworkManager
{
public:
    enum NetworkStatus
    {
        Unknown,
        Unmanaged,
        Unavailable,
        Connected,
        Disconnected
    };


    /**
     * @brief enumDevices 枚举网卡
     * @return 网卡列表
     */
    static QStringList enumDevices();

    /**
     * @brief enumConnections 枚举连接
     * @return 连接列表
     */
    static QStringList enumConnections();

    /**
     * @brief connectionExists 网络连接是否存在
     * @param name 连接名
     * @return 执行结果
     */
    static bool connectionExists(const QString &name);

    /**
     * @brief connectionStatus 查看网络连接状态
     * @param name 连接名
     * @return 网络状态
     */
    static NetworkStatus connectionStatus(const QString &name);

    /**
     * @brief addConnection 添加连接
     * @param name 连接名
     * @param device 网卡
     * @param message 执行日志
     * @return 执行结果
     */
    static bool addConnection(const QString &name, const QString &device, QString *message = Q_NULLPTR);

    /**
     * @brief changeConnectionName 改变网络连接名
     * @param oldName 旧连接名
     * @param newName 新连接名
     * @param message 执行日志
     * @return 执行结果
     */
    static bool changeConnectionName(const QString &oldName, const QString &newName, QString *message = Q_NULLPTR);

    /**
     * @brief removeConnection 移除连接
     * @param name 连接名
     * @param message 执行日志
     * @return 执行结果
     */
    static bool removeConnection(const QString &name, QString *message = Q_NULLPTR);

    /**
     * @brief enableConnection 激活连接
     * @param name 连接名
     * @param device 网卡
     * @param message 执行日志
     * @return 执行结果
     */
    static bool enableConnection(const QString &name, QString *message = Q_NULLPTR);

    /**
     * @brief disableConnection 禁用连接
     * @param name 连接名
     * @param device 网卡
     * @param message 执行日志
     * @return 执行结果
     */
    static bool disableConnection(const QString &name, QString *message = Q_NULLPTR);

    /**
     * @brief setIPAddress 设置IPv4地址
     * @param name 连接名
     * @param address IP地址
     * @param message 执行日志
     * @return 执行结果
     */
    static bool setIPAddress(const QString &name, const QString &address, QString *message = Q_NULLPTR);

    /**
     * @brief setIPAddress 设置IPv4子网掩码，修改前需确保IP不为空
     * @param name 连接名
     * @param netmask 子网掩码
     * @param message 执行日志
     * @return 执行结果
     */
    static bool setNetmask(const QString &name, const QString &netmask, QString *message = Q_NULLPTR);

    /**
     * @brief setIPAddress 设置IPv4网关，修改前需确保IP不为空
     * @param name 连接名
     * @param gateway 网关
     * @param message 执行日志
     * @return 执行结果
     */
    static bool setGateway(const QString &name, const QString &gateway, QString *message = Q_NULLPTR);

    /**
     * @brief setIPAddress 设置IPv4 dns服务器，修改前需确保IP不为空
     * @param name 连接名
     * @param dns dns服务器
     * @param message 执行日志
     * @return 执行结果
     */
    static bool setDNS(const QString &name, const QString &dns, QString *message = Q_NULLPTR);

    /**
     * @brief setDHCP 设置IPv4 dhcp
     * @param name 连接名
     * @param message 执行日志
     * @return 执行结果
     */
    static bool setDHCP(const QString &name, QString *message = Q_NULLPTR);

private:
    NetworkManager();
    Q_DISABLE_COPY(NetworkManager)
};

#endif // NETWORKMANAGER_H
